<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    "use strict";
    // 严格模式

    // JS弱类型的语言, JS创建之初存在很多不合理 不严谨 不安全的地方

    // ES5  => 严格模式 -> 解决JS在执行过程中 存在很多不合理 不严谨 不安全的地方  => 提高代码的执行速度 =>为未来版本做准备

    // 如何进入严格模式?  => 在作用域的最前面加字符串  "use strict";
    // 1.  全局作用域,在脚本的最前面添加关键词 "use strict"
    // 2.  函数作用域,在函数所有代码的最前面添加关键词 "use strict"


    // function fn() {
    //     "use strict";
    // }


    // 严格模式中 不通过关键词直接声明变量会报错
    // var a = 10;
    // b = 20;   //  b is not defined
    // console.log(a, b);


    // 严格模式中 上下文中不允许声明重复的参数名称,否则过报错
    // function add(a, b, b) { //  Duplicate parameter name not allowed in this context
    //     return a + b;
    // }

    // var res = add(1, 2, 3);
    // console.log(res);


    // 严格模式中 新增eval作用域,eval()函数中声明的变量也是局部的
    // eval("var a = 1,b = 2,c = a + b; console.log('函数内',a,b,c)");
    // console.log("函数外", a, b, c);

    // this -> 函数的关键词 -> 指向函数在调用时依存的对象
    // 严格模式中 要求函数调用时要有依存的对象,如果没有依存的对象  this默认undefined
    // function fn() {
    //     console.log(this);
    // }

    // fn();  // fn()调用时没有依存的对象 this -> undefined
    // window.fn(); // 有依存的对象  this-> window


    // 严格模式中 如果对象的属性不允许被删除  删除会报错

    // delete  删除对象的属性  => 删除成功 -> true 删除失败就返回false

    var obj = {
        name: "张三",
        age: 18,
        height: "176cm",
        weight: "70kg",
    }

    console.log(delete obj.height);
    console.log(delete obj.weight);

    console.log(obj);


    // 注意:   全局变量 都存储在window(GO对象中)  , 声明之后不允许被删除
    var x = 10;
    var y = 20;

    console.log(delete window.x);
    console.log(delete window.y);

    console.log(x, y);


</script>

</html>